package main

import (
	"fmt"
	"reflect"
)

// 普通函数
func add(a, b int) int {

	return a + b
}

func main() {

	// 将函数包装为反射值对象
	funcValue := reflect.ValueOf(add)

	// 构造函数参数, 传入两个整型值
	paramList := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}

	// 反射调用函数
	retList := funcValue.Call(paramList)

	// 获取第一个返回值, 取整数值
	fmt.Println(retList[0].Int())
}
// 反射调用函数的过程需要构造大量的 reflect.Value 和中间变量，对函数参数值进行逐一检查，还需要将调用参数复制到调用函数的参数内存中。
// 调用完毕后，还需要将返回值转换为 reflect.Value，用户还需要从中取出调用值。
// 因此，反射调用函数的性能问题尤为突出，不建议大量使用反射函数调用。